import java.util.Arrays;

class PosWrongfulException extends RuntimeException{
    public PosWrongfulException() {

    }

    public PosWrongfulException(String massage) {
        super(massage);
    }
}

class List {
    private int[] elem;//未初始化的数组
    private int usedSize;//记录有效的数据个数
    public static final int DEFAULT_SIZE = 10;

    //构造方法
    public List() {
        this.elem = new int[DEFAULT_SIZE];//数组大小为10个元素
    }

    //打印顺序表中所有的元素，这并不是顺序表中的方法，而是为了观看测试结果给出的
    public void disPlay() {
        for (int i = 0; i < this.usedSize; i++) {//usedSize是有效数据个数
            System.out.print(this.elem[i] + " ");//元素之间加上空格
        }
        System.out.println();//输出完后换行
    }

    //检查顺序表是否满了的方法
    public Boolean isFull() {
        //size()是获取顺序表长度的方法
        /*if (size() >= this.elem.length) { //满了
            return true;
        }else { //没满
            return false;
        }*/
//优化过后的写法 - 会自动比较出一个true || false
        return size() >= this.elem.length;
    }

    //默认在顺序表最后新增元素 - data是要新增的元素
    public void add(int data) {
        //1. 检查当前的顺序表是不是满了
        //isFull()方法中会有一个值来表示当前顺序表是不是满了
        if (isFull()) {
            //2. 如果满了 就要进行扩容
            //将elem扩容位原来的2倍
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }

        //3.新增元素
        //当前usedSize(有效元素个数)的值就是顺序表末尾的下标 - 要想新增赋值即可
        this.elem[this.usedSize] = data;

        //4.有效元素个数加1 - usedSize
        this.usedSize++;
    }


    /**
     * 如果 pos 下标不合法就会抛出一个异常
     *
     */

//在顺序表指定位置新增 - 在pos位置新增元素- data是要新增的元素
//throws PosWrongfulException可以提示调用者这个地方可能会有一个异常
    public void add(int pos, int data) throws PosWrongfulException{
        //1.负数下标不可以
        //2.要存储的位置pos前面一定是有元素的
        //usedSize在这里指的是顺序表末尾的位置下标
        if (pos < 0 || pos > this.usedSize) { //pos是指定新增位置的下标
            System.out.println("位置不合法！！！");
            //抛一个异常
            throw new PosWrongfulException("位置不合法！！！");
        }
        if (isFull()) {
            //3.超过数组长度不可以
            //满了就扩容
            System.out.println("顺序表满了");
            this.elem = Arrays.copyOf(this.elem, 2 * this.elem.length);
        }

        //程序执行到这里就可以插入一个元素了
        //1.开始挪动数据
        //从顺序表末位位置开始向后移动，直到遇到 pos 位置
        for (int i = this.usedSize - 1; i >= pos; i--) { //usedSize-1指的是顺序表末位位置的下标
            this.elem[i + 1] =  this.elem[i];
        }

        //2.在顺序表中插入一个元素
        this.elem[pos] = data;//data是要插入个元素

        //3.顺序表元素加1 - usedSize
        this.usedSize++;//顺序表有效元素个数加一个


    }

    //判定是否包含某个元素
    public boolean contains(int toFind) {
        return true;
    }

    //查找某个对应元素的位置
    public int indexOf (int toFind) {
        return -1;
    }

    //获取 pos 元素的位置
    public int get(int pos) {
        return -1;
    }

    //获取顺序表长度
    public int size() {
        return this.usedSize;
    }

    //清空顺序表
    public void clear() {

    }
}

public class MyArrayList {
    public static void main(String[] args) {
        List List = new List();
        List.add(1);//将顺序表中添加一个1元素
        List.add(2);
        List.add(3);
        List.disPlay();//调用打印方法定义顺序表中的所有元素

        try{
            List.add(10, 10);//将1下标的位置插入一个10
        }catch (PosWrongfulException e){ //包裹一下可能会抛出的异常
            e.printStackTrace();//如果有异常会提示出来
        }
        List.disPlay();//打印插入指定位置的顺序

    }
}
